package delta;

import java.util.ArrayList;

public class OutputComparer {

	/*
	 * True -val ter vissza ha ket lista tartalma (sorrendtol fuggetlenul)
	 * megegyezik visszater egy hibaleiro String -gel
	 */
	public static String compareElementLists(ArrayList<String> l1, ArrayList<String> l2) {
		// Ha a ket lista merete kulonbozo, mar alapbol nem lehet azonos a
		// tartalmuk
		if (l1.size() != l2.size()) {
			if (l1.size() > l2.size()) {
				for (String str : l1) {
					System.out.println(str);
				}
				return new String("Az elso fajlban tobb az objektum");
			}

			else if (l1.size() < l2.size())
				return new String("Az masodik fajlban tobb az objektum");
		}

		// Vegignezi az elso lista osszes elemet
		for (String str1 : l1) {
			Boolean talalat = false;
			String strForDelete = null;
			// Minden elemet osszehasonlit a masik lista elemivel
			for (String str2 : l2) {
				if (str2.equalsIgnoreCase(str1)) {
					talalat = true;
					strForDelete = str2;
					break;
				}
			}

			// Ha ekkor a talalat false,
			// az azt jelenti hogy a for ciklus vegigment a listan anelkul,
			// hogy talalt volna megegyezo szoveget
			if (talalat) {
				// Ez azert kell hogy a mar egyszer megtalalt stringet ne
				// talalja meg megegyszer
				l2.remove(strForDelete);
			} else
				return new String("itt nem egyenlo: " + str1);
		}
		return new String("A ket jatekallapot megegyezik");

	}

	/*
	 * A fuggveny feladata, hogy a megadott TtReaderek segitsegevel ellenorizze,
	 * hogy a ket fajlba a kovetkezo jatekallapotkiirasok megegyeznek -e.
	 */
	public static void readGameObjects(TtReader rd1, TtReader rd2) {
		String line;

		Boolean end = false;

		// Ebben tarolodik az aktualis objektumleiras
		// Fontos hogy null legyen, mert igy az elso enterek utan nem kerul be
		// semmi
		String sum = null;

		Boolean enterVolt = true;
		ArrayList<String> stringList1 = new ArrayList<String>();
		ArrayList<String> stringList2 = new ArrayList<String>();

		// =====================================================================
		// Az elso lista feltoltese az elso fajlbol
		// =====================================================================

		// Az elsovel kulon kell foglalkozni
		line = rd1.Read(true);

		while (!end) {
			// Ha Barmely fajlnak vege, hibasak a fajlok
			if (line == null) {
				if (line == null)
					System.out.println("Az elso fajlban nincs '}' jel");
				end = true;
			}
			// Ha lezaras van vege a listanak
			else if (line.equals("}")) {
				if (sum != null)
					stringList1.add(sum);
				end = true;
			} else if (line.equals("")) {
				enterVolt = true;
			}
			// ide csak akkor lep be, ha a legutobbi beolvasas nem sor vege volt
			else {
				if (enterVolt == true) {
					// Az elso enterek utan igy semmi sem kerul listazasra
					if (sum != null)
						stringList1.add(sum);
					sum = new String("");
					enterVolt = false;
				}
				// Space -ek eltavolitasa
				line = line.replaceAll("\\s+", "");
				sum += line;
				// space hogy olvashatobb legyen ha kiirjak
				sum += " ";

			}
			// A vegen ujabb olvasas
			if (!end)
				line = rd1.Read(true);
		}

		// =====================================================================
		// A masodik lista feltoltese a masodik fajlbol
		// =====================================================================

		end = false;
		sum = null;
		enterVolt = true;
		// Az elsovel kulon kell foglalkozni
		line = rd2.Read(true);

		while (!end) {
			// Ha Barmely fajlnak vege, hibasak a fajlok
			if (line == null) {
				if (line == null)
					System.out.println("A masodik fajlban nincs '}' jel");
				end = true;
			}
			// Ha lezaras van vege a listanak
			else if (line.equals("}")) {
				if (sum != null)
					stringList2.add(sum);
				end = true;
			} else if (line.equals("")) {
				enterVolt = true;
			}
			// ide csak akkor lep be, ha a legutobbi beolvasas nem sor vege volt
			else {
				if (enterVolt == true) {
					// Az elso enterek utan igy semmi sem kerul listazasra
					if (sum != null)
						stringList2.add(sum);
					sum = new String("");
					enterVolt = false;
				}
				// Space -ek eltavolitasa
				line = line.replaceAll("\\s+", "");
				sum += line;
				// space hogy olvashatobb legyen ha kiirjak
				sum += " ";

			}
			// A vegen ujabb olvasas
			if (!end)
				line = rd2.Read(true);
		}

		// ==========================================================================
		// A ket lista osszehasonlitasa
		// ==========================================================================

		String sr = compareElementLists(stringList1, stringList2);
		System.out.println(sr);

	}

	/*
	 * ez a fo fuggveny, ezt kell meghivni
	 */
	public static void compareOutPut(String file1, String file2) {

		// ==========================================================================
		// Inicializalas
		// ==========================================================================
		TtReader rd1 = new TtReader(file1);
		TtReader rd2 = new TtReader(file2);
		String f1Line;
		String f2Line;
		int lineNumber = 1;
		Boolean end = false;

		// ==========================================================================
		// Az elsovel kulon kell foglalkozni
		// ==========================================================================
		f1Line = rd1.Read(false);
		f2Line = rd2.Read(false);

		while (!end) {
			if (f1Line != null && f1Line.contains("betoltve")) {
				f1Line = rd1.Read(false);
				continue;
			} else if (f2Line != null && f2Line.contains("betoltve")) {
				f2Line = rd2.Read(false);
				continue;
			}
			if (f1Line == null && f2Line == null) {
				System.out.println("A ket szoveg egyezik");
				end = true;

			} else if (f1Line == null) {
				// Ha csak az egyik null akkor az egyik faljnak hamarabb vege
				// mint a masiknak
				System.out.println("Az elso faljnak hamarabb vege");
				System.out.println("A masodik fajl sorszama: " + lineNumber);
				System.out.println("A sor tartalma: " + f2Line);
				end = true;

			} else if (f2Line == null) {
				if (f1Line.contains("betoltve")) {
					f1Line = rd1.Read(false);
				}
				System.out.println("A masodik faljnak hamarabb vege");
				System.out.println("Az elso fajl sorszama: " + lineNumber);
				System.out.println("A sor tartalma:" + f1Line);
				end = true;
			}
			// Ha mindket fajlnak vege akkor megegyeznek

			// Ha egyik se null, akkor meg lehet vizsgalni hogy egyenloek -e
			else if (!f2Line.equals(f1Line)) {
				System.out.println("Ket sor nem egyezik meg");
				System.out.println("A fajlok sorszama:" + lineNumber);
				System.out.println("Az elso faljban itt: " + f1Line);
				System.out.println("Az masodik faljban itt: " + f2Line);

				end = true;

			} else {
				if (f1Line.equals("{")) {
					// ekkor objektumallapot kiiras van
					readGameObjects(rd1, rd2);

				}
				lineNumber++;
				f1Line = rd1.Read(false);
				f2Line = rd2.Read(false);
			}
		}
	}
}
